Strategy is a behavioral design pattern that lets you define a family of algorithms, put each of them into a separate class, and make their objects interchangeable.
--Refactoring Guru
策略模式是一種行為型設計模式,它允許你定義一系列的演算法,將每個演算法放入獨立的類別中,並使它們的物件可以相互替換。
策略模式通常用在以下情境:
演算法的多樣性:當你的應用需要支援多個不同的演算法或策略,並希望能夠在執行時根據情況切換或選擇合適的策略時。
避免條件語句複雜:當發現程式碼中存在大量的條件語句(if-else),來選擇不同的行為或演算法時,策略模式可以幫助將這些條件語句變得更容易理解和維護。
動態配置行為:需要在執行時能夠動態地切換應用的行為,而不必重新編譯程式碼。
分離演算法實作:當您希望分離不同演算法的實作,以便進行單獨測試和維護。這使得每個演算法都可以在獨立的類別中實作,提高了程式碼的可讀性和可維護性。
遵循開放/封閉原則:當你希望能夠輕鬆地擴展系統以支援新的策略,而不必修改現有的程式碼。
行為的共享:當多個不同的對象需要共享相同的演算法,策略模式可以幫助避免重複的程式碼。
策略模式的靈活性和可維護性使它成為處理具有多個變動部分的系統的有用工具,同時有助於減少代碼複雜度和提高程式設計的模組化。
乍看之下兩個模式是不是有點像呢~~
我昨天就被搞混了
我們來比較一下兩者~
特徵 | 策略模式(Strategy) | 狀態模式(State) |
---|---|---|
問題背景 | 選擇不同算法或策略,實現相同目標 | 管理內部狀態,基於狀態改變行為 |
用途 | 用於選擇不同的算法或策略,使客戶端能夠在執行時切換策略以達到相同的目標。 | 用於管理對象的內部狀態,並基於狀態的變化來改變對象的行為。它處理的是對象的生命週期和狀態遷移。 |
關注點 | 不同策略之間的替換性和選擇性 | 對象的內部狀態及其影響行為,處理狀態轉換 |
結構 | 通常包括上下文(Context)和具體策略(Concrete Strategy)這兩個主要元素,以及策略(Strategy)介面或抽象類別。 | 通常包括上下文(Context)和不同狀態(State)這兩個主要元素,以及狀態(State)介面或抽象類別。 |
狀態模式通常包括以下元素:
我們來寫一個簡單的C#加減法~利用策略模式的邏輯
首先是介面:
// 策略介面
public interface IOperation
{
int Execute(int a, int b);
}
再來是兩個具體策略,一個是加法一個是減法~
// 具體策略 - 加法
public class Addition : IOperation
{
public int Execute(int a, int b)
{
return a + b;
}
}
// 具體策略 - 減法
public class Subtraction : IOperation
{
public int Execute(int a, int b)
{
return a - b;
}
}
Context上下文:
// 上下文
public class Calculator
{
private IOperation operation;
public Calculator(IOperation operation)
{
this.operation = operation;
}
public void SetOperation(IOperation operation)
{
this.operation = operation;
}
public int Calculate(int a, int b)
{
return operation.Execute(a, b);
}
}
我們的主程式
class Program
{
static void Main()
{
// 創建計算機上下文,並設定加法策略
Calculator calculator = new Calculator(new Addition());
int result1 = calculator.Calculate(5, 3);
Console.WriteLine("加法結果: " + result1);
// 切換策略為減法
calculator.SetOperation(new Subtraction());
int result2 = calculator.Calculate(10, 4);
Console.WriteLine("減法結果: " + result2);
}
}
output: